package ocio.services;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.opensymphony.xwork2.Action;
import ocio.dao.ClientesDao;
import ocio.actions.AddClienteAction;
import ocio.actions.ListarClientesAction;
import ocio.actions.ModificarClienteAction;
import ocio.beans.Cliente;

/**
 * Clase encargada de ofrecer la lógica de negocio asociada a la clase Cliente.
 * Ofrece funciones CRUD para la gestión de clientes.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Cliente
 * @see ocio.services.ServiceIF
 */
public class ClienteService implements ServiceIF {

	ClientesDao clienteDao;
	
	public ClienteService (){
		clienteDao = new ClientesDao();
	}
	
	/**
	 * Solicita que se añada un cliente con los datos introducidos
	 * por el mismo cliente o por el administrador y recogidos en objeto de la clase Action
	 * @param form objeto de la clase Action con los datos del cliente
	 */
	@Override
	public boolean add(Action form) {
		
		Cliente c = new Cliente();
		AddClienteAction cform = (AddClienteAction) form;
		c.setCorreo(cform.getCorreo());
		if (clienteDao.findByExample(c).size()==0) {  //Añadir cliente
			c.setPassword(cform.getPassword());
			c.setRol(cform.getRol());
			c.setNombre(cform.getNombre());
			c.setTelefono(cform.getTelefono());
			c.setBaja(false);
			c.setFechabaja(null);
			c.setReservas(null);
			c.setSubscripciones(null);
			clienteDao.attachDirty(c);
			return true;
		} else { //Existe ya un cliente con ese correo
			return false;
		}
	}
	
	/**
	 * Solicita la lista de todos los clientes de la base de datos
	 * @return listaClientes Lista de todos los clientes de la base de datos.
	 */
	public List<Cliente> ListAllClients(){

		List<Cliente> listaClientes = new ArrayList<Cliente>();
		listaClientes = clienteDao.getAll();			
	    return listaClientes;
		
	}

	/**
	 * Solicita lista de todos los clientes que tengan en su nombre una cadena de texto dada
	 * @return listaClientes Lista de todos los clientes con una cadena de texto en su nombre.
	 */
	public List<Object> searchByNombre(String cadena){
		List<Object> resul = new ArrayList<Object>();
		List<Cliente> listaClientes = new ArrayList<Cliente>();
		
		listaClientes = clienteDao.findByLike(cadena);	
	    Iterator<Cliente> itr = listaClientes.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
	}
	
	/**
	 * Solicita la lista de todos los clientes que cumplan con los requisitos
	 * introducidos en un formulario y recogidos en un objeto de la clase Action
	 * @param form objeto de la clase Action con los datos de búsqueda.
	 * @return listaClientes Lista de todos los clientes que cumplen los criterios de búsqueda.
	 */
	public List<Object> searchByFields(Action form){

		List<Object> resul = new ArrayList<Object>();
		List<Cliente> listaClientes = new ArrayList<Cliente>();
		ListarClientesAction cform = (ListarClientesAction) form;
		Cliente c = new Cliente();
		
		c.setCorreo(cform.getCorreo());
		c.setPassword(cform.getPassword());
		c.setRol(2); //rol de cliente
	
		listaClientes = clienteDao.findByExample(c);	
	    Iterator<Cliente> itr = listaClientes.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
		
	}   

	/**
	 * Actualiza los datos del cliente en función de los campos introducidos
	 * por él mismo o por el administrador y recogidos en objeto de la clase Action
	 * @param form objeto de la clase Action con los datos del cliente
	 */
	@Override
	public void update(Action form) {
		Cliente c = new Cliente();
		ModificarClienteAction cform = (ModificarClienteAction) form;
		c = clienteDao.findById(cform.getId());
		 //Correo, campo que no se debe modificar.
		c.setNombre(cform.getNombre());
		if(cform.getPassword().length()!=0){
			c.setPassword(cform.getPassword());
		}
		c.setTelefono(cform.getTelefono());
		//El tipo NO se puede modificar
		clienteDao.attachDirty(c);
	}


	/**
	 * Búsqueda de cliente por identificador.
	 * @param id identifificador en la base de datos del cliente.
	 * @return c Objeto correspondiente al cliente con el identificador dado.
	 */
	public Object searchById(int id){
		Cliente c;
		c = clienteDao.findById(id);
		return c;
	}

	/**
	 * Borra el cliente.
	 * @param o Objeto correspondiente al cliente que se quiere borrar.
	 */
	@Override
	public void delete(Object o) {
		Date fecha= new Date();
		Cliente c;
		
		c = (Cliente)o;
		c.setBaja(true);
		c.setFechabaja(fecha);

		//hacemos baja lógica, no física
		//se pone baja=true y se guarda la fecha de baja

		clienteDao.attachDirty(c);

	}

}
